package zk_01.zookeeper.sample;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.apache.log4j.Logger;

public class WorkerCache {
	
	private static Logger logger = Logger.getLogger(WorkerCache.class);
	
	private List<String> list = null;
	//不需要关注并发的操作次对象带来的不确定性，因为ZK都会通知主节点做更新操作，最终都能保证任务分配给有效的从节点
	public WorkerCache(){
		list = new ArrayList<String>();
	}
	
	public List<String> update(List<String> l){
		List<String> dList = new ArrayList<String>();
		boolean flag = true;
		for(String scl:list){
			for(String spa:l){
				if(scl.equals(spa)){//循环比较换还未找到相同的，表示该从节点已经被删除，需要重新处理已经给他分配的任务
					flag = false;
					break;
				}
			}
			if(flag){
				dList.add(scl);//将已经删除的从节点加入列表，返回待处理
				flag=true;
			}
		}
		
		//更新本地缓存
		list.clear();
		list.addAll(l);
		return dList;
	}
	
	public int getSize(){
		for(;;){
				if(list!=null){
					return list.size();
				}else{
					logger.debug("no worker registered");
				}
		}
	}
	
	public String getWorkerName(){
		Random r = new Random();
		if(list!=null){
			int workerSize = list.size();
			if(workerSize!=0){
				int idx = r.nextInt(workerSize);
				return list.get(idx);
			}else{
				return null;
			}
		}else{
			return null;
		}
	}
}
